package sortieren;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class SortApplet extends JApplet{
  SortApp sortapp;

  @Override
  public void init(){
    sortapp=new SortApp();
    sortapp.algoname=getParameter("algoname");
    sortapp.makeWindow(getContentPane());
  }
  
  /**Ein Applet gibt Auskunft über sich durch diese Methode.
   * @return die Auskunft
   */
  @Override
  public String getAppletInfo() {
    return "Dieses Applet demonstriert Sortieralgorithmen.";
  }

  /**Hier wird Auskunft gegeben über die Parameter.
   * @return die Auskunft
   */
  @Override
  public String[][] getParameterInfo() {
    String[][] info={
      {"algoname", "string", "Name der Klasse mit dem Sortieralgorithmus."},
    };
    return info;
  }

  /**Damit die Klasse sowohl als Applet wie auch als Application anwendbar ist,
   * hat sie eine main-Methode.
   * @param args 
   */
  public static void main(String[] args) {
    JFrame frame=new JFrame("Sortieren");
    SortApp sortapp=new SortApp();
    sortapp.algoname=args[0];
    sortapp.makeWindow(frame.getContentPane());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }
}

/**Diese App stellt mit Hilfe eines StabDemonstrators einen
 * Sortieralgorithmus dar. Dieser kann als Parameter übergeben werden.
 */
class SortApp implements ActionListener{
  /**Der verwendete Stabdemonstrator.*/
  StabDemonstrator demo;
  /**Der darzustellende GetSwapSorter.*/
  GetSwapSorter alg;
  /** Eine Statuszeile, die anfangs den Namen des GetSwapSorter und am Ende
 die Anzahl der Zugriffe und Vertauschungen anzeigt.
   */  
  JLabel status;
  /**Zeigt den Verlangsamungsfaktor an.*/
  JTextField langsam;
  /**Beinhaltet den Namen des GetSwapSorter.*/
  String algoname;
  /**Die drei Buttons zur Bedienung*/
  private JButton mix, start, stop;

  /**Erzeugt die Oberfläche mit den Buttons für das Mischen, Sortieren
     und die Geschwindigkeitseinstellung. Der GetSwapSorter wird dynamisch
     erzeugt, weil als Parameter übergeben. Für die Darstellung wird ein
     Stabdemonstrator verwendet.
   */
  void makeWindow(Container content){
    //im Norden die Statuszeile
    status=new JLabel(algoname);
    content.add(status, BorderLayout.NORTH);
    //im Süden ein Panel mit zwei Buttons und einer Texteingabe
    JPanel p=new JPanel();
    mix=new JButton("mix");
    mix.addActionListener(this);
    p.add(mix);
    start=new JButton("start");
    start.addActionListener(this);
    p.add(start);
    stop=new JButton("stop");
    stop.addActionListener(this);
    p.add(stop);
    JLabel label=new JLabel("Bremsen: ");
    p.add(label);
    langsam=new JTextField("1",3);
    langsam.addActionListener(this);
    p.add(langsam);
    content.add(p,BorderLayout.SOUTH);
    //im Center der Demonstrator
    try{
      alg=(GetSwapSorter)Class.forName(algoname).newInstance();
      //alg=new QuickSort();
      demo=new StabDemonstrator();
      alg.addDemonstrator(demo);
      alg.setAll(GetSwapSorter.generate(1, 71, 70, true));
      content.add(demo, BorderLayout.CENTER);
    } catch(Exception e){status.setText(e.toString());}
  }

  /**Reagiert auf das Drücken der Buttons.
   * @param e wird nur verwendet, um zu erfahren, welcher Button diesen
   * Event verursacht hat.
   */
  @Override
  public void actionPerformed(ActionEvent e){
    int f;
    try{f=Integer.parseInt(langsam.getText());}
    catch(Exception ex){f=1;}
    alg.gmillis=alg.smillis=alg.mmillis=f*20;
    try{
      Object button=e.getSource();
      if(button==mix){
        alg.mix();
        status.setText(algoname);
      } else if(button==start){
        alg.start();
        status.setText(alg.name+" beim Sortieren");
      } else if(button==stop){
        status.setText(alg.name+" unterbrochen");
        alg.stop();
      }
    } catch(IllegalStateException ex){
      System.out.println("Falsche Eingabe");
    }
  }
}
